Prava na zaznamy

Otázka od: Roman

12. 8. 2004 21:29

Zdravim,
potrebuji poradit s pravy (select) nad radky tabulky (v Firebird 1 - 1.5).
Kazdy radek obsahuje identifikator skupiny (prefix). Uzivatele maji
nastaveno, ktere skupiny mohou videt. Uzivatel na urovni aplikace neni
uzivatel na urovni databaze, tj. vice uzivatelu v aplikaci muze byt jeden
uzivatel v databazi. Uzivatele v aplikaci jsou ulozeni v tabulce Uzivatele,
PK je Id_uzivatele. Problem chci vyresit nejakym objektem na urovni databaze
(tj. nechci v aplikaci vytvaret kontrukce typu SELECT ... WHERE prefix IN
(...)). V uvahu prichazi pouziti:
1. view - nevim, jak zjistit aktualniho uzivatele (id_uzivatele) v aplikaci?
Je mozne vytvorit nejaky objekt (zapsat "nekam id_uzivatele") pouze v
kontextu aktualniho pripojeni po dobu jeho trvani? Popr. da se to resit
pomoci UDF? Jak?
2. ulozena procedura s IN parametrem id_uzivatele - toto reseni se mi moc
nezamlouvat vzhledem k nemoznosti pouziti domen a nutne specifikaci vsech
parametru zdrojove tabulky (=> dvoji udrzba).
3. nejak uplne jinak?  
Ktera varianta je efektivnejsi co do zpracovani dotazu napr. v joinech?

Diky za pripadne reakce,
Roman


Odpovedá: David Fajfr

13. 8. 2004 9:50

> Zdravim,
> potrebuji poradit s pravy (select) nad radky tabulky (v Firebird 1 - 1.5).
> Kazdy radek obsahuje identifikator skupiny (prefix). Uzivatele maji
> nastaveno, ktere skupiny mohou videt. Uzivatel na urovni aplikace neni
> uzivatel na urovni databaze, tj. vice uzivatelu v aplikaci muze byt jeden
> uzivatel v databazi. Uzivatele v aplikaci jsou ulozeni v tabulce
Uzivatele,
> PK je Id_uzivatele. Problem chci vyresit nejakym objektem na urovni
databaze
> (tj. nechci v aplikaci vytvaret kontrukce typu SELECT ... WHERE prefix IN
> (...)).


Nejlepsi volbu asi stejne budes mit vytvaret dotazy v aplikaci.
Kdyz si po pripojeni databaze nactes prefixy, na ktere ma uzivatel narok,
bude pak celkem jednoduche tvorit selecty
SELECT ... FROM ... WHERE (PREFIX IN (pref1, pref2...)) AND (...dalsi
podminky...)
Nebo mas nejaky specialni duvod, proc to chces resit na DB urovni?



Odpovedá: Martin Cajbik

13. 8. 2004 13:58

No neviem, mne sa to ako zvlast efektivny sposob nevidi, to uz skor

SELECT ... FROM ...
WHERE (Prefix IN (
SELECT Prefix FROM UserPrefix WHERE User = ...)) AND (...dalsi

kde UserPrefix by bola tabulka priradenia jednotlivych prefixov k
pouzivatelom (N:N) so stlpcami User a Prefix.

Martin Cajbik

David Fajfr wrote:
>>Zdravim,
>>potrebuji poradit s pravy (select) nad radky tabulky (v Firebird 1 - 1.5).
>>Kazdy radek obsahuje identifikator skupiny (prefix). Uzivatele maji
>>nastaveno, ktere skupiny mohou videt. Uzivatel na urovni aplikace neni
>>uzivatel na urovni databaze, tj. vice uzivatelu v aplikaci muze byt jeden
>>uzivatel v databazi. Uzivatele v aplikaci jsou ulozeni v tabulce
>
> Uzivatele,
>
>>PK je Id_uzivatele. Problem chci vyresit nejakym objektem na urovni
>
> databaze
>
>>(tj. nechci v aplikaci vytvaret kontrukce typu SELECT ... WHERE prefix IN
>>(...)).
>
> Nejlepsi volbu asi stejne budes mit vytvaret dotazy v aplikaci.
> Kdyz si po pripojeni databaze nactes prefixy, na ktere ma uzivatel narok,
> bude pak celkem jednoduche tvorit selecty
> SELECT ... FROM ... WHERE (PREFIX IN (pref1, pref2...)) AND (...dalsi
> podminky...)
> Nebo mas nejaky specialni duvod, proc to chces resit na DB urovni?

Odpovedá: David Fajfr

13. 8. 2004 14:30

> No neviem, mne sa to ako zvlast efektivny sposob nevidi, to uz skor
>
> SELECT ... FROM ...
> WHERE (Prefix IN (
> SELECT Prefix FROM UserPrefix WHERE User = ...)) AND (...dalsi
>
> kde UserPrefix by bola tabulka priradenia jednotlivych prefixov k
> pouzivatelom (N:N) so stlpcami User a Prefix.


Myslel jsem, ze bude efektivnejsi, kdyz se seznam tech prefixu nacte jednou
po prihlaseni (jedine minus je prenos po siti), ulozi se naformatovany do
nejakeho globalniho stringu a pak se bude jen pridavat do podminky k
selectu. Mozna i FB ma radsi, kdyz se mu ten seznam hodnot predlozi uz v
dotazu nez kdyz bude muset pokazde provadet IN SELECT.

Ale mozna se mylim, chtelo by to vyzkouset  

David



Odpovedá: Roman

14. 8. 2004 20:06

> > Zdravim,
> > potrebuji poradit s pravy (select) nad radky tabulky (v Firebird 1 -
1.5).
> > Kazdy radek obsahuje identifikator skupiny (prefix). Uzivatele maji
> > nastaveno, ktere skupiny mohou videt. Uzivatel na urovni aplikace neni
> > uzivatel na urovni databaze, tj. vice uzivatelu v aplikaci muze byt
jeden
> > uzivatel v databazi. Uzivatele v aplikaci jsou ulozeni v tabulce
> Uzivatele,
> > PK je Id_uzivatele. Problem chci vyresit nejakym objektem na urovni
> databaze
> > (tj. nechci v aplikaci vytvaret kontrukce typu SELECT ... WHERE prefix
IN
> > (...)).
>
>
> Nejlepsi volbu asi stejne budes mit vytvaret dotazy v aplikaci.
> Kdyz si po pripojeni databaze nactes prefixy, na ktere ma uzivatel narok,
> bude pak celkem jednoduche tvorit selecty
> SELECT ... FROM ... WHERE (PREFIX IN (pref1, pref2...)) AND (...dalsi
> podminky...)
> Nebo mas nejaky specialni duvod, proc to chces resit na DB urovni?

Toto reseni se mi libi z pohledu rychlosti, ale uz mene z pohledu udrzby a
mam obavy z velikosti IN (nikde jsem tuto hodnotu v dokumentaci nenasel).
Omezeni zaznamu podle prefixu bude v kazdem dotazu s danou tabulkou.
Problem je s dotazy, kt. si muze uzivatel vytvorit sam (sestavy, exporty).
Reseni na urovni databaze se jevilo jednodussi pro udrzbu aplikace (tj. pro
mne  .

Roman